﻿using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using Microsoft.Office.Interop.Word;
using System.Collections.Generic;
using CRM.Database.Model;
using DataTable = System.Data.DataTable;
using DataRow = System.Data.DataRow;

namespace Utilites
{
    public static class DocReport
    {
        private static object _false = false;
        private static object _missing = Type.Missing;
        private static object missing = Type.Missing;

        /// <summary>
        /// Шаблон DOC файла по умолчанию
        /// </summary>
        private const string DefaultWordDocumentTemplate = @"Normal.dot";

        public struct DocReportParamsItem
        {
            public string bookmarkName;
            public string value;
            public DocReportParamsItem(string BookmarkName, string Value)
            {
                bookmarkName = BookmarkName;
                value = !string.IsNullOrEmpty(Value) ? Value.Trim() : Value;
            }
            public DocReportParamsItem(DocBookmarks docBookmark, string Value)
            {
                value = !string.IsNullOrEmpty(Value) ? Value.Trim() : Value;
                bookmarkName = docBookmark.ToString();
            }
        }

        /// <summary>
        /// Вспомогательный класс для работы с таблицами Word документа
        /// </summary>
        public class DocReportTablesParams
        {
            public int DocTableIndex { get; set; }
            public DataTable DataTable { get; set; }
            public int StartRow { get; set; }
        }

        #region General methods

        public static string TestDocCreation(string sourceFilePath, object targetFilePath, List<DocReportParamsItem> param)
        {
            var App = new Microsoft.Office.Interop.Word.Application();
            var doc = App.Documents.Open(sourceFilePath);

            foreach(var item in param)
            {
                if(doc.Bookmarks.Exists(item.bookmarkName))
                {
                    object bookmarkName = item.bookmarkName;
                    doc.Bookmarks.get_Item(ref bookmarkName).Range.Text = item.value;
                }
            }

            doc.SaveAs(ref targetFilePath, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing,
                                ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing,
                                ref _missing, ref _missing);
            App.Documents.Close();

            return "";
        }

        public static string GetStringForReponse(string directFilePath)
        {

            directFilePath=directFilePath.Replace(@"\",@"/");
            return @"<script>window.open('file:"+directFilePath+"')</script>";
        }

        /// <summary>
        /// Заполнение документа закладками, таблицами и сохранение готового документа под грушим именем
        /// По умолчанию работает с уже открытым 
        /// </summary>
        /// <param name="sourceFilePath">файл шаблона</param>
        /// <param name="targetFilePath">результат</param>
        /// <param name="param">список закладок</param>
        /// <param name="tablesParams">список заполненных таблиц с индексами</param>
        public static bool CreateDoc(string sourceFilePath, string targetFilePath, List<DocReportParamsItem> param, List<DocReportTablesParams> tablesParams)
        {
            if (string.IsNullOrEmpty(sourceFilePath)) return false;
            if (string.IsNullOrEmpty(targetFilePath)) return false;
            if (!File.Exists(sourceFilePath)) return false;

            object readOnly = true;
            object inFile = sourceFilePath;
            object outFile = targetFilePath;
            object dontSave = false;

            var result = true;
            
            //открываем приложение Word
            var wordApplication = new Application {Visible = false};
            
            //открываем файл Word
            try
            {
                //открыть документ
                var wordDocument = wordApplication.Documents.Open(ref inFile, ref _missing, ref readOnly, ref _missing,
                                                                    ref _missing, ref _missing, ref _missing, ref _missing,
                                                                    ref _missing, ref _missing, ref _missing, ref _missing,
                                                                    ref _missing, ref _missing, ref _missing, ref _missing);
                if (wordDocument == null) return false;

                //заполнение закладок в документе
                foreach (var item in param)
                {
                    object bookmarkName = item.bookmarkName;
                    if (wordDocument.Bookmarks.Exists(item.bookmarkName))
                    {
                        wordDocument.Bookmarks.get_Item(ref bookmarkName).Range.Text = item.value;
                    }
                }

                
                //вызов функции заполнения таблиц 
                if (tablesParams != null)
                    if (tablesParams.Count > 0)
                        result = FillWordTablesWithDataTables(wordDocument, tablesParams);
                
                //сохранить документ
                wordDocument.SaveAs(ref outFile, ref _missing, ref _missing, ref _missing,
                                    ref _missing, ref _missing, ref _missing, ref _missing,
                                    ref _missing, ref _missing, ref _missing, ref _missing,
                                    ref _missing, ref _missing, ref _missing, ref _missing);
            }
            catch (Exception ex)
            {

            }
            finally
            {
                //В конце закрываем приложение Word
                wordApplication.Quit(ref dontSave, ref _missing, ref _missing);
            }
            return result;
        }

        /// <summary>
        /// Заполняет таблицы в документе
        /// </summary>
        /// <param name="wordDocument">указатель на открытый документ Word</param>
        /// <param name="tablesParamsList"></param>
        /// <returns></returns>
        public static bool FillWordTablesWithDataTables(Document wordDocument, List<DocReportTablesParams> tablesParamsList)
        {
            //проверка входящих параметров
            if (wordDocument == null) 
                return false;
            if (tablesParamsList.Count < 1) 
                return true;
            if (tablesParamsList.Any(item => item.StartRow < 1))
            {
                return false;
            }

            //проверка наличия таблиц в документе
            if (wordDocument.Tables.Count < 1) 
                return false;

            //цикл по листу с таблицами
            foreach (var tableParams in tablesParamsList)
            {
                //отктырие таблицы
                var wordTable = wordDocument.Tables[tableParams.DocTableIndex];
                if (wordTable == null) 
                    return false;

                //проверка соответствия кол-в столбцов
                var wordTableColumsCount = wordDocument.Tables[tableParams.DocTableIndex].Columns.Count;
                var dataTableColumnCount = tableParams.DataTable.Columns.Count;
                if (wordTableColumsCount != dataTableColumnCount) 
                    return false;

                //проверка наличия хотя бы одного ряда в DataTable
                if (wordTable.Rows.Count == 0) 
                    return true;

                //цикл по рядам таблицы DataTable
                for (var row = 0; row < tableParams.DataTable.Rows.Count; row++)
                {
                    //цикл по ячейкам в ряде
                    for (var column = 0; column < tableParams.DataTable.Columns.Count; column++)
                    {
                        //получение ячейки таблицы word
                        var wordCell = wordTable.Cell(row + tableParams.StartRow, column + 1);
                        if (wordCell == null) 
                            return false;

                        //заполнение ячейки word
                        var dataRow = tableParams.DataTable.Rows[row];
                        if (dataRow == null) continue;
                        var cellData = dataRow[column];
                        if (!string.IsNullOrEmpty(cellData.ToString()))
                            wordTable.Cell(row + tableParams.StartRow, column + 1).Range.Text = cellData.ToString();
                    }
                    //добавление следующего ряда
                    if (row < tableParams.DataTable.Rows.Count - 1)
                        wordTable.Rows.Add(ref missing);
                }
            }
            return true;
        }

        public static  void CreateDoc(string sourceFilePath, string targetFilePath, List<DocReportParamsItem> param)
        {
            //что-то типо клиента для доступа в ворд
            Application wordApp = null;
           
            try
            {
                // если есть экземпляр - использовать его
                Global wordGlob = new Global();
                wordApp = wordGlob.Application;
            }
            catch
            {
                // если экземпляра нет - создать
                wordApp = new Application();
                wordApp.Visible = false;
            }

            object dotfile = sourceFilePath;
            object Unknown = Type.Missing;
            
            Document wordDoc = null;
            
            wordDoc = wordApp.Documents.Open(ref dotfile, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown,
                                             ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, 
                                             ref Unknown, ref Unknown, ref Unknown, ref Unknown);
            
            foreach (DocReportParamsItem item in param)
            {
                object bookmarkName = item.bookmarkName;
                try
                {
                    if (wordDoc != null)
                        if (wordDoc.Bookmarks.Exists(item.bookmarkName))
                        {
                            wordDoc.Bookmarks.get_Item(ref bookmarkName).Range.Text = item.value;
                        }
                }
                catch
                {
                }
            }

            dotfile = targetFilePath;
            if (wordDoc != null)
            {
                wordDoc.SaveAs(ref dotfile, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing,
                               ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing,
                               ref _missing, ref _missing);
                wordDoc.Close(ref _missing, ref _missing, ref _missing);
            }

            wordApp.Quit(ref _false, ref _missing, ref _missing);

            wordDoc = null;
            wordApp = null;
        }

        public static void CreateDoc(string sourceFilePath, string tempFilePath, string targetFilePath, List<DocReportParamsItem> param)
        {
            //что-то типо клиента для доступа в ворд
            Application wordApp = null;

            try
            {
                // если есть экземпляр - использовать его
                Global wordGlob = new Global();
                wordApp = wordGlob.Application;
            }
            catch
            {
                // если экземпляра нет - создать
                wordApp = new Application();
                wordApp.Visible = false;
            }

            object dotfile = sourceFilePath;

            object Unknown = Type.Missing;

            Document wordDoc = null;
            try
            {
                wordDoc = wordApp.Documents.Open(ref dotfile, ref Unknown,
                                                                                   ref Unknown, ref Unknown,
                                                                                   ref Unknown, ref Unknown,
                                                                                   ref Unknown, ref Unknown,
                                                                                   ref Unknown, ref Unknown,
                                                                                   ref Unknown, ref Unknown,
                                                                                   ref Unknown, ref Unknown,
                                                                                   ref Unknown, ref Unknown);


            }

            catch
            {

            }

            foreach (DocReportParamsItem item in param)
            {
                object bookmarkName = item.bookmarkName;
                try
                {
                    if (wordDoc != null)
                        if (wordDoc.Bookmarks.Exists(item.bookmarkName))
                        {
                            wordDoc.Bookmarks.get_Item(ref bookmarkName).Range.Text = item.value;
                        }
                }
                catch
                {
                }
            }

            dotfile = targetFilePath;
            if (wordDoc != null)
            {
                wordDoc.SaveAs(ref dotfile, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing,
                               ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing,
                               ref _missing, ref _missing);
                dotfile = tempFilePath;
                wordDoc.SaveAs(ref dotfile, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing,
                               ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing, ref _missing,
                               ref _missing, ref _missing);

                wordDoc.Close(ref _missing, ref _missing, ref _missing);
            }
            wordApp.Quit(ref _false, ref _missing, ref _missing);
        }

        /// <summary>
        /// Возвращает указатель на открытое приложение Word или открывает новое
        /// </summary>
        /// <returns></returns>
        public static Application OpenWordApplication()
        {
            Application wordApplication;
            try
            {
                // если есть экземпляр - использовать его
                var wordGlobal = new Global();
                wordApplication = wordGlobal.Application;
            }
            catch
            {
                // если экземпляра нет - создать
                wordApplication = new Application { Visible = false };
            }
            return wordApplication;
        }
        
        #endregion

        #region Technic methods

        /// <summary>
        /// Склеивает файлы DOC из массива файлов в один файл на основе шаблона documentTemplate
        /// пример Utilites.DocReport.Merge(new[] { "2.doc" }, "3.doc", true, "1.doc");
        /// </summary>
        /// <param name="filesToMerge">файлы из которых копируется инфа</param>
        /// <param name="outputFilename">результирующий файл</param>
        /// <param name="insertPageBreaks">вставлять разрывы страниц между файлами?</param>
        /// <param name="documentTemplate">шаблон результирующего файла</param>
        public static void Merge(string[] filesToMerge, string outputFilename, bool insertPageBreaks, string documentTemplate = DefaultWordDocumentTemplate)
        {
            object defaultTemplate = documentTemplate;
            object missing = Type.Missing;
            object pageBreak = WdBreakType.wdPageBreak;
            object outputFile = outputFilename;
            object dontSave = false;

            //что-то типо клиента для доступа в ворд
            Application wordApplication = null;

            try
            {
                // если есть экземпляр - использовать его
                Global wordGlob = new Global();
                wordApplication = wordGlob.Application;
            }
            catch
            {
                // если экземпляра нет - создать
                wordApplication = new Application();
                wordApplication.Visible = false;
            }


            try
            {
                // Create a new file based on our template
                _Document wordDocument = wordApplication.Documents.Add(
                                              ref defaultTemplate
                                            , ref missing
                                            , ref missing
                                            , ref missing);

                // Make a Word selection object.
                Selection selection = wordApplication.Selection;

                // Loop thru each of the Word documents
                foreach (string file in filesToMerge)
                {
                    // Insert the files to our template
                    selection.InsertFile(file
                                            , ref missing
                                            , ref missing
                                            , ref missing
                                            , ref missing);

                    //Do we want page breaks added after each documents?
                    if (insertPageBreaks)
                    {
                        selection.InsertBreak(ref pageBreak);
                    }
                }

                // Save the document to it's output file.
                wordDocument.SaveAs(
                                ref outputFile
                            , ref missing
                            , ref missing
                            , ref missing
                            , ref missing
                            , ref missing
                            , ref missing
                            , ref missing
                            , ref missing
                            , ref missing
                            , ref missing
                            , ref missing
                            , ref missing
                            , ref missing
                            , ref missing
                            , ref missing);

                // Clean up!
                wordDocument = null;
            }
            catch (Exception ex)
            {
                //I didn't include a default error handler so i'm just throwing the error
                throw ex;
            }
            finally
            {
                // Finally, Close our Word application
                wordApplication.Quit(ref dontSave, ref missing, ref missing);
            }
        }

        /// <summary>
        /// Создание первой страницы отчета
        /// </summary>
        /// <param name="inputFile"></param>
        /// <param name="outputFile"></param>
        /// <param name="param"></param>
        /// <param name="dataTable"></param>
        public static void TechnicReportTitle(string inputFile, string outputFile, List<DocReportParamsItem> param, DataTable dataTable)
        {
            object missing = Type.Missing;
            object readOnly = true;
            object inFile = inputFile;
            object outFile = outputFile;
            object dontSave = false;
            int equipmentTableIndex = 3;

            //что-то типо клиента для доступа в ворд
            Application wordApplication = null;

            try
            {
                // если есть экземпляр - использовать его
                Global wordGlobal = new Global();
                wordApplication = wordGlobal.Application;
            }
            catch
            {
                // если экземпляра нет - создать
                wordApplication = new Application();
                wordApplication.Visible = false;
            }

            try
            {
                //открыть документ
                Document wordDocument = wordApplication.Documents.Open(ref inFile, ref missing, ref readOnly, ref missing,
                                                                       ref missing, ref missing, ref missing, ref missing,
                                                                       ref missing, ref missing, ref missing, ref missing,
                                                                       ref missing, ref missing, ref missing, ref missing);
                if(wordDocument==null)return;
                
                //заполнение закладок в документе
                foreach (DocReportParamsItem item in param)
                {
                    object bookmarkName = item.bookmarkName;
                    if (wordDocument.Bookmarks.Exists(item.bookmarkName))
                    {
                        wordDocument.Bookmarks.get_Item(ref bookmarkName).Range.Text = item.value;
                    }
                }

                FillEquipmentsWordTable(wordDocument, dataTable, equipmentTableIndex);
                
                //сохранить документ
                wordDocument.SaveAs(ref outFile, ref missing, ref missing, ref missing,
                                    ref missing, ref missing, ref missing, ref missing,
                                    ref missing, ref missing, ref missing, ref missing,
                                    ref missing, ref missing, ref missing, ref missing);
                // Clean up!
                wordDocument = null;
                
            }
            catch (Exception ex)
            {
                
            }
            finally
            {
                //В конце закрываем приложение Word
                wordApplication.Quit(ref dontSave, ref missing, ref missing);
            }
            return;
        }

        /// <summary>
        /// Заполняет таблицу в документе информацией об оборудовании из DataTable 
        /// row["EquipmentTypeNameRu"]    
        /// row["EquipmentTypeNameEn"]
        /// row["EquipmentCount"]
        /// row["VendorNameExt"]
        /// row["ModelExt"]
        /// row["IssueDate"]
        /// </summary>
        /// <param name="wordDocument">открытый документ</param>
        /// <param name="dataTable"></param>
        /// <param name="tableIndex">номер нужной таблицы в документе</param>
        public static void FillEquipmentsWordTable(Document wordDocument, DataTable dataTable, int tableIndex)
        {
            Table tableItem = null;

            if (wordDocument.Tables.Count < 1) return;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return;

            //добавление строк в таблицу оборудования Word

            tableItem.Range.Font.Size = 8;
            tableItem.Borders.Enable = 1;
            tableItem.Range.Borders.DistanceFromLeft = 0;
            int rowIndex = 1;
            int newTypeIndex = 2;
            string previousName = "";

            if (dataTable!=null)
            {

                 
                int tableColumsCount=wordDocument.Tables[tableIndex].Columns.Count;
                int dataTableColumnCount = dataTable.Columns.Count;


                foreach (DataRow rowItem in dataTable.Rows)
                {
                    //новый ряд
                    tableItem.Rows.Add(ref missing);
                    rowIndex++;

                    //добавление нового обозначения обозначения
                    if ((previousName != rowItem["EquipmentTypeNameRu"] as string))
                    {
                        if (newTypeIndex < rowIndex)
                        {
                            Cell cell = wordDocument.Tables[tableIndex].Cell(newTypeIndex, 1);
                            cell.Merge(wordDocument.Tables[tableIndex].Cell(rowIndex, 1));
                        }

                        if (rowIndex > 2)
                        {
                            tableItem.Rows.Add(ref missing);
                            rowIndex++;
                        }
                        //добавление в новый ряд обозначения оборудования по-русски
                        tableItem.Cell(rowIndex, 1).Range.Text = rowItem["EquipmentTypeNameRu"] as string;
                        Cell cellItem = tableItem.Cell(rowIndex, 1);
                        object start = cellItem.Range.Start;
                        object end = cellItem.Range.End;
                        //добавление немецкого названия
                        cellItem.Range.Text += rowItem["EquipmentTypeNameEn"] as string;
                        //форматирование текста и выравнивание текста в ячейке
                        Range r2 = cellItem.Range;
                        r2.Font.Bold = 0;
                        r2.Font.Italic = 1;
                        r2.Font.Size = 6;
                        Range r1 = wordDocument.Range(start, end);
                        r1.Font.Bold = 1;
                        r1.Font.Italic = 0;
                        r1.Font.Size = 8;
                        cellItem.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;
                        previousName = rowItem["EquipmentTypeNameRu"] as string;
                        newTypeIndex = rowIndex;
                    }
                    else
                    {
                        Cell cell = wordDocument.Tables[tableIndex].Cell(newTypeIndex, 1);
                        cell.Merge(wordDocument.Tables[tableIndex].Cell(rowIndex, 1));
                    }

                    //добавление даты
                    tableItem.Cell(rowIndex, 6).Range.Text = rowItem["IssueDate"] as string;

                    //добавление кол-ва
                    tableItem.Cell(rowIndex, 3).Range.Text = rowItem["EquipmentCount"] as string;

                    //добавление изготовителя
                    tableItem.Cell(rowIndex, 4).Range.Text = rowItem["VendorNameExt"] as string;

                    //добавление модели(типа)
                    tableItem.Cell(rowIndex, 5).Range.Text = rowItem["ModelExt"] as string;
                }

                Cell cell1 = wordDocument.Tables[tableIndex].Cell(newTypeIndex, 1);
                cell1.Merge(wordDocument.Tables[tableIndex].Cell(rowIndex + 1, 1));
            }

            

            //добавление трех пустых рядов
            for (int i = 0; i < 3; i++)
            {
                tableItem.Rows.Add(ref missing);
            }

            return;
        }

        /// <summary>
        /// Считывает информацию из вложенного файла в БД и привязывает результаты к заявке
        /// </summary>
        /// <param name="attachment"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        public static bool TechnicReportAnalyse(TechnicRequestAttachments attachment, string user)
        {
            if (attachment == null) return false;
            if (attachment.IdTechnicRequest < 1) return false;
            if (!attachment.FileExists()) return false;
            if (string.IsNullOrEmpty(user)) return false;

            //получить коллекцию заявок
            var requestsCollection = new TechnicRequestsCollection();
            //получить заявку 
            var request = requestsCollection.GetItemById(attachment.IdTechnicRequest) as TechnicRequests;
            if (request == null) return false;
            //открываем Word
            var wordApplication = OpenWordApplication();
            if (wordApplication == null) return false;
            //открываем документ
            object readOnly = true;
            object inFile = attachment.Path;
            var wordDocument = wordApplication.Documents.Open(ref inFile, ref missing, ref readOnly, ref missing,
                                                                       ref missing, ref missing, ref missing, ref missing,
                                                                       ref missing, ref missing, ref missing, ref missing,
                                                                       ref missing, ref missing, ref missing, ref missing);
            if (wordDocument == null) return false;

            //заполняем индексы таблиц в документе
            int tableIndex1 = 4;
            int tableIndex2 = 5;
            int tableIndex3 = 6;
            int tableIndex4 = 7;
            int tableIndex5 = 8;
            int tableIndex6 = 9;
            int tableIndex7 = 10;
            int tableIndex8 = 11;
            int tableIndex9 = 13;
            int tableIndex10 = 14;
            int tableIndex11 = 15;
            int tableIndex12 = 16;
            int tableIndex13 = 17;

            //читаем таблицы из файла и сохраняем информацию в заявку
            try
            {
                //-----------------------
                //  TechnicReport 1
                //-----------------------

                //получить данные из таблицы в отчете
                TechnicReport1 newReport1 = GetTechnicReport1(wordDocument, tableIndex1);
                newReport1.IdTechnicRequest = request.IdTechnicRequest;
                
                //получить коллекцию объектов TechnicReport1
                var technicReport1Col = new TechnicReport1Collection();
                //проверить существует ли объект
                var oldReport1 = technicReport1Col.GetItemByRequestId(request.IdTechnicRequest);
                //если объекта нет - добавляем новый
                if (oldReport1 == null) technicReport1Col.Add(newReport1, user);
                //если есть - обновляем существующий
                if (oldReport1 != null)
                {
                    newReport1.IdTechnicReport1 = oldReport1.IdTechnicReport1;
                    technicReport1Col.Update(newReport1, user);
                }

                ////-----------------------
                ////  TechnicReport 2
                ////-----------------------

                ////получить данные из таблицы в отчете
                TechnicReport2 newReport2 = GetTechnicReport2(wordDocument, tableIndex2);
                newReport2.IdTechnicRequest = request.IdTechnicRequest;

                //получить коллекцию объектов TechnicReport2
                var technicReport2Col = new TechnicReport2Collection();
                //проверить существует ли объект
                var oldReport2 = technicReport2Col.GetItemByRequestId(request.IdTechnicRequest);
                //если объекта нет - добавляем новый
                if (oldReport2 == null) technicReport2Col.Add(newReport2, user);
                //если есть - обновляем существующий
                if (oldReport2 != null)
                {
                    newReport2.IdTechnicReport2 = oldReport2.IdTechnicReport2;
                    technicReport2Col.Update(newReport2, user);
                }

                ////-----------------------
                ////  TechnicReport 3
                ////-----------------------

                ////получить данные из таблицы в отчете
                TechnicReport3 newReport3 = GetTechnicReport3(wordDocument, tableIndex3);
                newReport3.IdTechnicRequest = request.IdTechnicRequest;

                //получить коллекцию объектов TechnicReport3
                var technicReport3Col = new TechnicReport3Collection();
                //проверить существует ли объект
                var oldReport3 = technicReport3Col.GetItemByRequestId(request.IdTechnicRequest);
                //если объекта нет - добавляем новый
                if (oldReport3 == null) technicReport3Col.Add(newReport3, user);
                //если есть - обновляем существующий
                if (oldReport3 != null)
                {
                    newReport3.IdTechnicReport3 = oldReport3.IdTechnicReport3;
                    technicReport3Col.Update(newReport3, user);
                }

                ////-----------------------
                ////  TechnicReport 4
                ////-----------------------

                ////получить данные из таблицы в отчете
                TechnicReport4 newReport4 = GetTechnicReport4(wordDocument, tableIndex4);
                newReport4.IdTechnicRequest = request.IdTechnicRequest;

                //получить коллекцию объектов TechnicReport4
                var technicReport4Col = new TechnicReport4Collection();
                //проверить существует ли объект
                var oldReport4 = technicReport4Col.GetItemByRequestId(request.IdTechnicRequest);
                //если объекта нет - добавляем новый
                if (oldReport4 == null) technicReport4Col.Add(newReport4, user);
                //если есть - обновляем существующий
                if (oldReport4 != null)
                {
                    newReport4.IdTechnicReport4 = oldReport4.IdTechnicReport4;
                    technicReport4Col.Update(newReport4, user);
                }

                ////-----------------------
                ////  TechnicReport 5
                ////-----------------------

                ////получить данные из таблицы в отчете
                TechnicReport5 newReport5 = GetTechnicReport5(wordDocument, tableIndex5);
                newReport5.IdTechnicRequest = request.IdTechnicRequest;

                //получить коллекцию объектов TechnicReport5
                var technicReport5Col = new TechnicReport5Collection();
                //проверить существует ли объект
                var oldReport5 = technicReport5Col.GetItemByRequestId(request.IdTechnicRequest);
                //если объекта нет - добавляем новый
                if (oldReport5 == null) technicReport5Col.Add(newReport5, user);
                //если есть - обновляем существующий
                if (oldReport5 != null)
                {
                    newReport5.IdTechnicReport5 = oldReport5.IdTechnicReport5;
                    technicReport5Col.Update(newReport5, user);
                }

                ////-----------------------
                ////  TechnicReport 6
                ////-----------------------

                ////получить данные из таблицы в отчете
                TechnicReport6 newReport6 = GetTechnicReport6(wordDocument, tableIndex6);
                newReport6.IdTechnicRequest = request.IdTechnicRequest;

                //получить коллекцию объектов TechnicReport6
                var technicReport6Col = new TechnicReport6Collection();
                //проверить существует ли объект
                var oldReport6 = technicReport6Col.GetItemByRequestId(request.IdTechnicRequest);
                //если объекта нет - добавляем новый
                if (oldReport6 == null) technicReport6Col.Add(newReport6, user);
                //если есть - обновляем существующий
                if (oldReport6 != null)
                {
                    newReport6.IdTechnicReport6 = oldReport6.IdTechnicReport6;
                    technicReport6Col.Update(newReport6, user);
                }

                ////-----------------------
                ////  TechnicReport 7
                ////-----------------------

                ////получить данные из таблицы в отчете
                TechnicReport7 newReport7 = GetTechnicReport7(wordDocument, tableIndex7);
                newReport7.IdTechnicRequest = request.IdTechnicRequest;

                //получить коллекцию объектов TechnicReport7
                var technicReport7Col = new TechnicReport7Collection();
                //проверить существует ли объект
                var oldReport7 = technicReport7Col.GetItemByRequestId(request.IdTechnicRequest);
                //если объекта нет - добавляем новый
                if (oldReport7 == null) technicReport7Col.Add(newReport7, user);
                //если есть - обновляем существующий
                if (oldReport7 != null)
                {
                    newReport7.IdTechnicReport7 = oldReport7.IdTechnicReport7;
                    technicReport7Col.Update(newReport7, user);
                }

                ////-----------------------
                ////  TechnicReport 8
                ////-----------------------

                ////получить данные из таблицы в отчете
                TechnicReport8 newReport8 = GetTechnicReport8(wordDocument, tableIndex8);
                newReport8.IdTechnicRequest = request.IdTechnicRequest;

                //получить коллекцию объектов TechnicReport8
                var technicReport8Col = new TechnicReport8Collection();
                //проверить существует ли объект
                var oldReport8 = technicReport8Col.GetItemByRequestId(request.IdTechnicRequest);
                //если объекта нет - добавляем новый
                if (oldReport8 == null) technicReport8Col.Add(newReport8, user);
                //если есть - обновляем существующий
                if (oldReport8 != null)
                {
                    newReport8.IdTechnicReport8 = oldReport8.IdTechnicReport8;
                    technicReport8Col.Update(newReport8, user);
                }

                ////-----------------------
                ////  TechnicReport 9
                ////-----------------------

                ////получить данные из таблицы в отчете
                TechnicReport9 newReport9 = GetTechnicReport9(wordDocument, tableIndex9);
                newReport9.IdTechnicRequest = request.IdTechnicRequest;

                //получить коллекцию объектов TechnicReport9
                var technicReport9Col = new TechnicReport9Collection();
                //проверить существует ли объект
                var oldReport9 = technicReport9Col.GetItemByRequestId(request.IdTechnicRequest);
                //если объекта нет - добавляем новый
                if (oldReport9 == null) technicReport9Col.Add(newReport9, user);
                //если есть - обновляем существующий
                if (oldReport9 != null)
                {
                    newReport9.IdTechnicReport9 = oldReport9.IdTechnicReport9;
                    technicReport9Col.Update(newReport9, user);
                }

                ////-----------------------
                ////  TechnicReport 10
                ////-----------------------

                ////получить данные из таблицы в отчете
                TechnicReport10 newReport10 = GetTechnicReport10(wordDocument, tableIndex10);
                newReport10.IdTechnicRequest = request.IdTechnicRequest;

                //получить коллекцию объектов TechnicReport10
                var technicReport10Col = new TechnicReport10Collection();
                //проверить существует ли объект
                var oldReport10 = technicReport10Col.GetItemByRequestId(request.IdTechnicRequest);
                //если объекта нет - добавляем новый
                if (oldReport10 == null) technicReport10Col.Add(newReport10, user);
                //если есть - обновляем существующий
                if (oldReport10 != null)
                {
                    newReport10.IdTechnicReport10 = oldReport10.IdTechnicReport10;
                    technicReport10Col.Update(newReport10, user);
                }

                ////-----------------------
                ////  TechnicReport 11
                ////-----------------------

                ////получить данные из таблицы в отчете
                TechnicReport11 newReport11 = GetTechnicReport11(wordDocument, tableIndex11);
                newReport11.IdTechnicRequest = request.IdTechnicRequest;

                //получить коллекцию объектов TechnicReport11
                var technicReport11Col = new TechnicReport11Collection();
                //проверить существует ли объект
                var oldReport11 = technicReport11Col.GetItemByRequestId(request.IdTechnicRequest);
                //если объекта нет - добавляем новый
                if (oldReport11 == null) technicReport11Col.Add(newReport11, user);
                //если есть - обновляем существующий
                if (oldReport11 != null)
                {
                    newReport11.IdTechnicReport11 = oldReport11.IdTechnicReport11;
                    technicReport11Col.Update(newReport11, user);
                }

                ////-----------------------
                ////  TechnicReport 12
                ////-----------------------

                ////получить данные из таблицы в отчете
                TechnicReport12 newReport12 = GetTechnicReport12(wordDocument, tableIndex12);
                newReport12.IdTechnicRequest = request.IdTechnicRequest;

                //получить коллекцию объектов TechnicReport12
                var technicReport12Col = new TechnicReport12Collection();
                //проверить существует ли объект
                var oldReport12 = technicReport12Col.GetItemByRequestId(request.IdTechnicRequest);
                //если объекта нет - добавляем новый
                if (oldReport12 == null) technicReport12Col.Add(newReport12, user);
                //если есть - обновляем существующий
                if (oldReport12 != null)
                {
                    newReport12.IdTechnicReport12 = oldReport12.IdTechnicReport12;
                    technicReport12Col.Update(newReport12, user);
                }

                ////-----------------------
                ////  TechnicReport 13
                ////-----------------------

                ////получить данные из таблицы в отчете
                request.Report = GetTechnicReport13(wordDocument, tableIndex13);

                //обновление существующей заявки
                var res = requestsCollection.Update(request, user);

            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                //В конце закрываем приложение Word
                object dontSave = false;
                wordApplication.Quit(ref dontSave, ref missing, ref missing);
            }
            return true;
        }

        /// <summary>
        /// получение нового объекта отчета из таблицы
        /// </summary>
        /// <param name="wordDocument"></param>
        /// <param name="tableIndex"></param>
        /// <returns></returns>
        private static string GetTechnicReport13(Document wordDocument, int tableIndex)
        {
            var result = "";
            //открытие таблицы
            Table tableItem = null;
            if (wordDocument.Tables.Count < 1) return null;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return null;

            //чтение данных из таблицы

            if (tableItem.Rows.Count < 1) return result;
            int rowCount = 1;
            foreach (var row in tableItem.Rows)
            {
                var cell = GetStringValue(tableItem, rowCount, 1, false);
                if (!string.IsNullOrEmpty(cell))
                    result = result + " " + cell;
                rowCount++;
            }
            return result;
        }

        /// <summary>
        /// получение нового объекта отчета из таблицы
        /// </summary>
        /// <param name="wordDocument"></param>
        /// <param name="tableIndex"></param>
        /// <returns></returns>
        private static TechnicReport12 GetTechnicReport12(Document wordDocument, int tableIndex)
        {
            var result = new TechnicReport12();
            //открытие таблицы
            Table tableItem = null;
            if (wordDocument.Tables.Count < 1) return null;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return null;

            //чтение данных из таблицы

            //температура зеркала
            result.Field1 = GetDoubleValue(tableItem, 2, 3);
            result.Field2 = GetDoubleValue(tableItem, 2, 4);
            result.Field3 = GetDoubleValue(tableItem, 2, 5);
            result.Field4 = GetDoubleValue(tableItem, 2, 6);

            //температура стула
            result.Field5 = GetDoubleValue(tableItem, 3, 3);
            result.Field6 = GetDoubleValue(tableItem, 3, 4);
            result.Field7 = GetDoubleValue(tableItem, 3, 5);
            result.Field8 = GetDoubleValue(tableItem, 3, 6);

            //давление разогрева
            result.Field9 = GetDoubleValue(tableItem, 4, 3);
            result.Field10 = GetDoubleValue(tableItem, 4, 4);
            result.Field11 = GetDoubleValue(tableItem, 4, 5);
            result.Field12 = GetDoubleValue(tableItem, 4, 6);

            //давление сварки
            result.Field13 = GetDoubleValue(tableItem, 5, 3);
            result.Field14 = GetDoubleValue(tableItem, 5, 4);
            result.Field15 = GetDoubleValue(tableItem, 5, 5);
            result.Field16 = GetDoubleValue(tableItem, 5, 6);

            //время плавления
            result.Field17 = GetDoubleValue(tableItem, 6, 3);
            result.Field18 = GetDoubleValue(tableItem, 6, 4);
            result.Field19 = GetDoubleValue(tableItem, 6, 5);
            result.Field20 = GetDoubleValue(tableItem, 6, 6);

            //время охлаждения
            result.Field21 = GetDoubleValue(tableItem, 7, 3);
            result.Field22 = GetDoubleValue(tableItem, 7, 4);
            result.Field23 = GetDoubleValue(tableItem, 7, 5);
            result.Field24 = GetDoubleValue(tableItem, 7, 6);

            //величина уварки
            result.Field25 = GetDoubleValue(tableItem, 8, 3);
            result.Field26 = GetDoubleValue(tableItem, 8, 4);
            result.Field27 = GetDoubleValue(tableItem, 8, 5);
            result.Field28 = GetDoubleValue(tableItem, 8, 6);

            //толшина зеркала
            result.Field29 = GetDoubleValue(tableItem, 9, 3);
            result.Field30 = GetDoubleValue(tableItem, 9, 4);
            result.Field31 = GetDoubleValue(tableItem, 9, 5);
            result.Field32 = GetDoubleValue(tableItem, 9, 6);

            //конечная точка плавления
            result.Field33 = GetDoubleValue(tableItem, 10, 3);
            result.Field34 = GetDoubleValue(tableItem, 10, 4);
            result.Field35 = GetDoubleValue(tableItem, 10, 5);
            result.Field36 = GetDoubleValue(tableItem, 10, 6);

            //толщина шва
            result.Field37 = GetDoubleValue(tableItem, 11, 3);
            result.Field38 = GetDoubleValue(tableItem, 11, 4);
            result.Field39 = GetDoubleValue(tableItem, 11, 5);
            result.Field40 = GetDoubleValue(tableItem, 11, 6);

            //коэффициент вдавливания
            result.Field41 = GetDoubleValue(tableItem, 12, 3);
            result.Field42 = GetDoubleValue(tableItem, 12, 4);
            result.Field43 = GetDoubleValue(tableItem, 12, 5);
            result.Field44 = GetDoubleValue(tableItem, 12, 6);


            return result;
        }

        /// <summary>
        /// получение нового объекта отчета из таблицы
        /// </summary>
        /// <param name="wordDocument"></param>
        /// <param name="tableIndex"></param>
        /// <returns></returns>
        private static TechnicReport11 GetTechnicReport11(Document wordDocument, int tableIndex)
        {
            var result = new TechnicReport11();
            //открытие таблицы
            Table tableItem = null;
            if (wordDocument.Tables.Count < 1) return null;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return null;

            //чтение данных из таблицы

            //марка и модель станка
            result.Field1 = GetStringValue(tableItem, 2, 1);
            //название фирмы-переработчика
            result.Field2 = GetStringValue(tableItem, 2, 2);

            return result;
        }

        /// <summary>
        /// получение нового объекта отчета из таблицы
        /// </summary>
        /// <param name="wordDocument"></param>
        /// <param name="tableIndex"></param>
        /// <returns></returns>
        private static TechnicReport10 GetTechnicReport10(Document wordDocument, int tableIndex)
        {
            var result = new TechnicReport10();
            //открытие таблицы
            Table tableItem = null;
            if (wordDocument.Tables.Count < 1) return null;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return null;

            //чтение данных из таблицы

            //рама арт
            result.Field1 = GetStringValue(tableItem, 1, 2);
            result.Field2 = GetStringValue(tableItem, 1, 4);

            //створка арт
            result.Field3 = GetStringValue(tableItem, 2, 2);
            result.Field4 = GetStringValue(tableItem, 2, 4);

            //импост арт
            result.Field5 = GetStringValue(tableItem, 3, 2);
            result.Field6 = GetStringValue(tableItem, 3, 4);

            //соед импоста арт
            result.Field7 = GetStringValue(tableItem, 4, 2);
            result.Field8 = GetStringValue(tableItem, 4, 4);

            //штапик арт
            result.Field9 = GetStringValue(tableItem, 5, 2);
            result.Field10 = GetStringValue(tableItem, 5, 4);

            //уплотнитель притвор арт
            result.Field11 = GetStringValue(tableItem, 6, 2);
            result.Field12 = GetStringValue(tableItem, 6, 4);

            //уплотнитель под с.п. арт
            result.Field13 = GetStringValue(tableItem, 7, 2);
            result.Field14 = GetStringValue(tableItem, 7, 4);

            //штрина створки
            result.Field15 = GetDoubleValue(tableItem, 8, 2);
            result.Field16 = GetDoubleValue(tableItem, 8, 4);

            //высота створки
            result.Field17 = GetDoubleValue(tableItem, 9, 2);
            result.Field18 = GetDoubleValue(tableItem, 9, 4);

            //марка фурнитуры
            result.Field19 = GetStringValue(tableItem, 10, 2);
            result.Field20 = GetStringValue(tableItem, 10, 4);

            //запорная планка арт
            result.Field21 = GetStringValue(tableItem, 11, 2);
            result.Field22 = GetStringValue(tableItem, 11, 4);

            //П-О запорная планка
            result.Field23 = GetStringValue(tableItem, 12, 2);
            result.Field24 = GetStringValue(tableItem, 12, 4);

            return result;
        }

        /// <summary>
        /// получение нового объекта отчета из таблицы
        /// </summary>
        /// <param name="wordDocument"></param>
        /// <param name="tableIndex"></param>
        /// <returns></returns>
        private static TechnicReport9 GetTechnicReport9(Document wordDocument, int tableIndex)
        {
            var result = new TechnicReport9();
            //открытие таблицы
            Table tableItem = null;
            if (wordDocument.Tables.Count < 1) return null;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return null;

            //чтение данных из таблицы

            //1
            result.Field1 = GetDoubleValue(tableItem, 1, 1);
            result.Field2 = GetDoubleValue(tableItem, 1, 2);
            result.Field3 = GetDoubleValue(tableItem, 1, 3);
            result.Field4 = GetDoubleValue(tableItem, 1, 4);
            result.Field5 = GetDoubleValue(tableItem, 1, 5);
            result.Field6 = GetDoubleValue(tableItem, 1, 6);
            result.Field7 = GetDoubleValue(tableItem, 1, 7);
            result.Field8 = GetDoubleValue(tableItem, 1, 9);
            result.Field9 = GetDoubleValue(tableItem, 1, 10);
            result.Field10 = GetDoubleValue(tableItem, 1, 11);
            result.Field11 = GetDoubleValue(tableItem, 1, 12);
            result.Field12 = GetDoubleValue(tableItem, 1, 13);
            result.Field13 = GetDoubleValue(tableItem, 1, 14);
            result.Field14 = GetDoubleValue(tableItem, 1, 15);

            //2
            result.Field15 = GetDoubleValue(tableItem, 2, 1);
            result.Field16 = GetDoubleValue(tableItem, 2, 3);
            result.Field17 = GetDoubleValue(tableItem, 2, 5);
            result.Field18 = GetDoubleValue(tableItem, 2, 7);

            //3
            result.Field19 = GetDoubleValue(tableItem, 3, 1);
            result.Field20 = GetDoubleValue(tableItem, 3, 3);
            result.Field21 = GetDoubleValue(tableItem, 3, 5);
            result.Field22 = GetDoubleValue(tableItem, 3, 7);

            //4
            result.Field23 = GetDoubleValue(tableItem, 4, 1);
            result.Field24 = GetDoubleValue(tableItem, 4, 3);
            result.Field25 = GetDoubleValue(tableItem, 4, 5);
            result.Field26 = GetDoubleValue(tableItem, 4, 7);

            //5
            result.Field27 = GetDoubleValue(tableItem, 5, 1);
            result.Field28 = GetDoubleValue(tableItem, 5, 3);
            result.Field29 = GetDoubleValue(tableItem, 5, 5);
            result.Field30 = GetDoubleValue(tableItem, 5, 7);

            //6
            result.Field31 = GetDoubleValue(tableItem, 6, 1);
            result.Field32 = GetDoubleValue(tableItem, 6, 3);
            result.Field33 = GetDoubleValue(tableItem, 6, 5);
            result.Field34 = GetDoubleValue(tableItem, 6, 7);

            //7
            result.Field35 = GetDoubleValue(tableItem, 7, 1);
            result.Field36 = GetDoubleValue(tableItem, 7, 2);
            result.Field37 = GetDoubleValue(tableItem, 7, 3);
            result.Field38 = GetDoubleValue(tableItem, 7, 4);
            result.Field39 = GetDoubleValue(tableItem, 7, 5);
            result.Field40 = GetDoubleValue(tableItem, 7, 6);
            result.Field41 = GetDoubleValue(tableItem, 7, 7);
            result.Field42 = GetDoubleValue(tableItem, 7, 9);
            result.Field43 = GetDoubleValue(tableItem, 7, 10);
            result.Field44 = GetDoubleValue(tableItem, 7, 11);
            result.Field45 = GetDoubleValue(tableItem, 7, 12);
            result.Field46 = GetDoubleValue(tableItem, 7, 13);
            result.Field47 = GetDoubleValue(tableItem, 7, 14);
            result.Field48 = GetDoubleValue(tableItem, 7, 15);

            //9
            result.Field49 = GetBoolValue(tableItem, 9, 2);
            result.Field50 = GetBoolValue(tableItem, 9, 3);
            result.Field51 = GetBoolValue(tableItem, 9, 4);
            result.Field52 = GetBoolValue(tableItem, 9, 5);
            result.Field53 = GetBoolValue(tableItem, 9, 6);
            result.Field54 = GetBoolValue(tableItem, 9, 9);
            result.Field55 = GetBoolValue(tableItem, 9, 10);
            result.Field56 = GetBoolValue(tableItem, 9, 11);
            result.Field57 = GetBoolValue(tableItem, 9, 12);
            result.Field58 = GetBoolValue(tableItem, 9, 13);

            return result;
        }

        /// <summary>
        /// получение нового объекта отчета из таблицы
        /// </summary>
        /// <param name="wordDocument"></param>
        /// <param name="tableIndex"></param>
        /// <returns></returns>
        private static TechnicReport8 GetTechnicReport8(Document wordDocument, int tableIndex)
        {
            var result = new TechnicReport8();
            //открытие таблицы
            Table tableItem = null;
            if (wordDocument.Tables.Count < 1) return null;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return null;

            //чтение данных из таблицы

            //наличие профилей других призводителей
            result.Field1 = GetStringValue(tableItem, 1, 2);
            result.Field2 = GetStringValue(tableItem, 1, 3);
            result.Field3 = GetStringValue(tableItem, 1, 4);
            result.Field4 = GetStringValue(tableItem, 1, 5);
            result.Field5 = GetStringValue(tableItem, 1, 6);

            //используемая фурнитура системы
            result.Field6 = GetStringValue(tableItem, 2, 2);
            result.Field7 = GetStringValue(tableItem, 2, 3);
            result.Field8 = GetStringValue(tableItem, 2, 4);
            result.Field9 = GetStringValue(tableItem, 2, 5);
            result.Field10 = GetStringValue(tableItem, 2, 6);

            return result;
        }

        /// <summary>
        /// получение нового объекта отчета из таблицы
        /// </summary>
        /// <param name="wordDocument"></param>
        /// <param name="tableIndex"></param>
        /// <returns></returns>
        private static TechnicReport7 GetTechnicReport7(Document wordDocument, int tableIndex)
        {
            var result = new TechnicReport7();
            //открытие таблицы
            Table tableItem = null;
            if (wordDocument.Tables.Count < 1) return null;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return null;

            //чтение данных из таблицы

            //собственный испытательный стенд
            //да?
            result.Field1 = GetBoolValue(tableItem, 1, 3);
            //нет?
            result.Field2 = GetBoolValue(tableItem, 1, 5);
            //замечания
            result.Field3 = GetStringValue(tableItem, 1, 7);

            //на испытательном стенде profine RUS
            //да?
            result.Field4 = GetBoolValue(tableItem, 2, 3);
            //нет?
            result.Field5 = GetBoolValue(tableItem, 2, 5);
            //замечания
            result.Field6 = GetStringValue(tableItem, 2, 7);

            //в независимом институте
            //да?
            result.Field7 = GetBoolValue(tableItem, 3, 3);
            //нет?
            result.Field8 = GetBoolValue(tableItem, 3, 5);
            //замечания
            result.Field9 = GetStringValue(tableItem, 3, 7);


            return result;
        }

        /// <summary>
        /// получение нового объекта отчета из таблицы
        /// </summary>
        /// <param name="wordDocument"></param>
        /// <param name="tableIndex"></param>
        /// <returns></returns>
        private static TechnicReport6 GetTechnicReport6(Document wordDocument, int tableIndex)
        {
            var result = new TechnicReport6();
            //открытие таблицы
            Table tableItem = null;
            if (wordDocument.Tables.Count < 1) return null;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return null;

            //чтение данных из таблицы

            //арт № 207
            //А
            result.Field1 = GetDoubleValue(tableItem, 2, 3);
            //B
            result.Field2 = GetDoubleValue(tableItem, 2, 5);
            //C
            result.Field3 = GetDoubleValue(tableItem, 2, 7);
            //D
            result.Field4 = GetDoubleValue(tableItem, 2, 9);
            //расстояние
            result.Field5 = GetDoubleValue(tableItem, 2, 10);

            //арт № 406
            //А
            result.Field6 = GetDoubleValue(tableItem, 3, 3);
            //B
            result.Field7 = GetDoubleValue(tableItem, 3, 5);
            //C
            result.Field8 = GetDoubleValue(tableItem, 3, 7);
            //D
            result.Field9 = GetDoubleValue(tableItem, 3, 9);
            //расстояние
            result.Field10 = GetDoubleValue(tableItem, 3, 10);

            //арт № S422520
            //А
            result.Field11 = GetDoubleValue(tableItem, 4, 3);
            //B
            result.Field12 = GetDoubleValue(tableItem, 4, 5);
            //C
            result.Field13 = GetDoubleValue(tableItem, 4, 7);
            //D
            result.Field14 = GetDoubleValue(tableItem, 4, 9);
            //расстояние
            result.Field15 = GetDoubleValue(tableItem, 4, 10);

            //арт № 791715
            //А
            result.Field16 = GetDoubleValue(tableItem, 5, 3);
            //B
            result.Field17 = GetDoubleValue(tableItem, 5, 5);
            //C
            result.Field18 = GetDoubleValue(tableItem, 5, 7);
            //D
            result.Field19 = GetDoubleValue(tableItem, 5, 9);
            //расстояние
            result.Field20 = GetDoubleValue(tableItem, 5, 10);

            //арт № 793720
            //А
            result.Field21 = GetDoubleValue(tableItem, 6, 3);
            //B
            result.Field22 = GetDoubleValue(tableItem, 6, 5);
            //C
            result.Field23 = GetDoubleValue(tableItem, 6, 7);
            //D
            result.Field24 = GetDoubleValue(tableItem, 6, 9);
            //расстояние
            result.Field25 = GetDoubleValue(tableItem, 6, 10);

            //арт № 628208
            //А
            result.Field26 = GetDoubleValue(tableItem, 7, 3);
            //B
            result.Field27 = GetDoubleValue(tableItem, 7, 5);
            //C
            result.Field28 = GetDoubleValue(tableItem, 7, 7);
            //D
            result.Field29 = GetDoubleValue(tableItem, 7, 9);
            //расстояние
            result.Field30 = GetDoubleValue(tableItem, 7, 10);

            //арт № 638108
            //А
            result.Field31 = GetDoubleValue(tableItem, 8, 3);
            //B
            result.Field32 = GetDoubleValue(tableItem, 8, 5);
            //C
            result.Field33 = GetDoubleValue(tableItem, 8, 7);
            //D
            result.Field34 = GetDoubleValue(tableItem, 8, 9);
            //расстояние
            result.Field35 = GetDoubleValue(tableItem, 8, 10);

            return result;
        }

        /// <summary>
        /// получение нового объекта отчета из таблицы
        /// </summary>
        /// <param name="wordDocument"></param>
        /// <param name="tableIndex"></param>
        /// <returns></returns>
        private static TechnicReport5 GetTechnicReport5(Document wordDocument, int tableIndex)
        {
            var result = new TechnicReport5();
            //открытие таблицы
            Table tableItem = null;
            if (wordDocument.Tables.Count < 1) return null;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return null;

            //чтение данных из таблицы

            //замечания
            result.Field1 = GetStringValue(tableItem, 1, 3);

            //уплотнение протягиваемое вручную оригинальное
            //да?
            result.Field2 = GetBoolValue(tableItem, 2, 3);
            //нет?
            result.Field3 = GetBoolValue(tableItem, 2, 5);
            //замечания
            result.Field4 = GetStringValue(tableItem, 2, 7);

            
            //уплотнение арт
            result.Field5 = GetStringValue(tableItem, 3, 2);
            //замечания
            result.Field6 = GetStringValue(tableItem, 3, 4);

            //уплотнение арт
            result.Field7 = GetStringValue(tableItem, 4, 2);
            //замечания
            result.Field8 = GetStringValue(tableItem, 4, 4);

            //уплотнение арт
            result.Field9 = GetStringValue(tableItem, 5, 2);
            //замечания
            result.Field10 = GetStringValue(tableItem, 5, 4);

            //соединитель импоста оригинальный
            //да?
            result.Field11 = GetBoolValue(tableItem, 7, 3);
            //нет?
            result.Field12 = GetBoolValue(tableItem, 7, 5);
            //да?
            result.Field13 = GetBoolValue(tableItem, 7, 7);
            //нет?
            result.Field14 = GetBoolValue(tableItem, 7, 9);
            //да?
            result.Field15 = GetBoolValue(tableItem, 7, 11);
            //нет?
            result.Field16 = GetBoolValue(tableItem, 7, 13);
            //да?
            result.Field17 = GetBoolValue(tableItem, 7, 15);
            //нет?
            result.Field18 = GetBoolValue(tableItem, 7, 17);
            //да?
            result.Field19 = GetBoolValue(tableItem, 7, 19);
            //нет?
            result.Field20 = GetBoolValue(tableItem, 7, 21);

            return result;
        }

        /// <summary>
        /// получение нового объекта отчета из таблицы
        /// </summary>
        /// <param name="wordDocument"></param>
        /// <param name="tableIndex"></param>
        /// <returns></returns>
        private static TechnicReport4 GetTechnicReport4(Document wordDocument, int tableIndex)
        {
            var result = new TechnicReport4();
            //открытие таблицы
            Table tableItem = null;
            if (wordDocument.Tables.Count < 1) return null;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return null;

            //чтение данных из таблицы

            //фальцлюфт 12мм да?
            result.Field1 = GetBoolValue(tableItem, 1, 3);
            //фальцлюфт 12мм нет?
            result.Field2 = GetBoolValue(tableItem, 1, 5);
            //замечания
            result.Field3 = GetStringValue(tableItem, 1, 7);

            return result;
        }

        /// <summary>
        /// получение нового объекта отчета из таблицы
        /// </summary>
        /// <param name="wordDocument"></param>
        /// <param name="tableIndex"></param>
        /// <returns></returns>
        private static TechnicReport3 GetTechnicReport3(Document wordDocument, int tableIndex)
        {
            var result = new TechnicReport3();
            //открытие таблицы
            Table tableItem = null;
            if (wordDocument.Tables.Count < 1) return null;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return null;

            //чтение данных из таблицы

            //положение подкладок под остекление да?
            result.Field1 = GetBoolValue(tableItem, 1, 3);
            //положение подкладок под остекление нет?
            result.Field2 = GetBoolValue(tableItem, 1, 5);
            //замечания
            result.Field3 = GetStringValue(tableItem, 1, 7);

            //правильное кол-во подкладок да?
            result.Field4 = GetBoolValue(tableItem, 2, 3);
            //правильное кол-во подкладок нет?
            result.Field5 = GetBoolValue(tableItem, 2, 5);
            //замечания
            result.Field6 = GetStringValue(tableItem, 2, 7);

            return result;
        }

        /// <summary>
        /// получение нового объекта отчета из таблицы
        /// </summary>
        /// <param name="wordDocument"></param>
        /// <param name="tableIndex"></param>
        /// <returns></returns>
        private static TechnicReport2 GetTechnicReport2(Document wordDocument, int tableIndex)
        {
            var result = new TechnicReport2();
            //открытие таблицы
            Table tableItem = null;
            if (wordDocument.Tables.Count < 1) return null;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return null;

            //чтение данных из таблицы

            //визуальное качество плохое? 
            result.Field1 = GetBoolValue(tableItem, 1, 3);
            //визуальное качество удовл? 
            result.Field2 = GetBoolValue(tableItem, 1, 5);
            //визуальное качество хорошее? 
            result.Field3 = GetBoolValue(tableItem, 1, 7);
            
            //чистота зачистки углов плохое? 
            result.Field4 = GetBoolValue(tableItem, 2, 3);
            //чистота зачистки углов удовл? 
            result.Field5 = GetBoolValue(tableItem, 2, 5);
            //чистота зачистки углов хорошее? 
            result.Field6 = GetBoolValue(tableItem, 2, 7);
            
            //чистота и равномерность канавки плохое? 
            result.Field7 = GetBoolValue(tableItem, 3, 3);
            //чистота и равномерность канавки удовл? 
            result.Field8 = GetBoolValue(tableItem, 3, 5);
            //чистота и равномерность канавки хорошее? 
            result.Field9 = GetBoolValue(tableItem, 3, 7);
            
            //установка уплотнений плохое? 
            result.Field10 = GetBoolValue(tableItem, 4, 3);
            //установка уплотнений удовл? 
            result.Field11 = GetBoolValue(tableItem, 4, 5);
            //установка уплотнений хорошее? 
            result.Field12 = GetBoolValue(tableItem, 4, 7);

            //точночть установки импостов плохое? 
            result.Field13 = GetBoolValue(tableItem, 5, 3);
            //точночть установки импостов удовл? 
            result.Field14 = GetBoolValue(tableItem, 5, 5);
            //точночть установки импостов хорошее? 
            result.Field15 = GetBoolValue(tableItem, 5, 7);

            //установка штапика плохое? 
            result.Field16 = GetBoolValue(tableItem, 6, 3);
            //установка штапика удовл? 
            result.Field17 = GetBoolValue(tableItem, 6, 5);
            //установка штапика хорошее? 
            result.Field18 = GetBoolValue(tableItem, 6, 7);

            //чистота водоотводящих шлицов плохое? 
            result.Field19 = GetBoolValue(tableItem, 7, 3);
            //чистота водоотводящих шлицов удовл? 
            result.Field20 = GetBoolValue(tableItem, 7, 5);
            //чистота водоотводящих шлицов хорошее? 
            result.Field21 = GetBoolValue(tableItem, 7, 7);

            //положение водоотводящих шлицов плохое? 
            result.Field22 = GetBoolValue(tableItem, 8, 3);
            //положение водоотводящих шлицов удовл? 
            result.Field23 = GetBoolValue(tableItem, 8, 5);

            //кол-во водоотводящих шлицов плохое? 
            result.Field24 = GetBoolValue(tableItem, 9, 3);
            //кол-во водоотводящих шлицов удовл? 
            result.Field25 = GetBoolValue(tableItem, 9, 5);

            //отверстия выравнивания давления не выполнены? 
            result.Field26 = GetBoolValue(tableItem, 10, 3);
            //отверстия выравнивания давления выполнены? 
            result.Field27 = GetBoolValue(tableItem, 10, 5);

            return result;
        }

        /// <summary>
        /// получение нового отчета
        /// </summary>
        /// <param name="wordDocument"></param>
        /// <param name="tableIndex"></param>
        /// <returns></returns>
        private static TechnicReport1 GetTechnicReport1(Document wordDocument, int tableIndex)
        {
            var result = new TechnicReport1();
            //открытие таблицы
            Table tableItem = null;
            if (wordDocument.Tables.Count < 1) return null;
            tableItem = wordDocument.Tables[tableIndex];
            if (tableItem == null) return null;

            //грязно?
            result.Field1 = GetBoolValue(tableItem, 1, 3);
            //удовл?
            result.Field2 = GetBoolValue(tableItem, 1, 5);
            //чисто?
            result.Field3 = GetBoolValue(tableItem, 1, 7);
            //температура в цехе зимой
            result.Field4 = GetIntValue(tableItem, 2, 2);

            return result;
        }

        /// <summary>
        /// Возвращает DOUBLE из строки или null
        /// </summary>
        /// <param name="table"></param>
        /// <param name="row"></param>
        /// <param name="cell"></param>
        /// <returns></returns>
        private static double? GetDoubleValue(Table table, int row, int cell)
        {
            double result;
            try
            {
                var value = table.Cell(row, cell).Range.Text;
                value = value.Replace("\r", string.Empty);
                value = value.Replace("\a", string.Empty);
                value.Trim();
                value = value.Replace(".", ",");
                var parseResult = double.TryParse(value, out result);
                if (!parseResult) return null;
            }
            catch
            {
                return null;
            }
            return result;
        }

        /// <summary>
        /// возвращает строку из ячейки без пробелов и сомфолов перехода на новую строку
        /// </summary>
        /// <param name="table"></param>
        /// <param name="row"></param>
        /// <param name="cell"></param>
        /// <param name="deleteNewLinesAndSpaces"></param>
        /// <returns></returns>
        private static string GetStringValue(Table table, int row, int cell, bool deleteNewLinesAndSpaces = true)
        {
            try
            {
                var value = table.Cell(row, cell).Range.Text;
                if (deleteNewLinesAndSpaces)
                {
                    value = value.Replace("\r", string.Empty);
                    value = value.Replace("\a", string.Empty);
                    value.Trim();
                }
                return value;
            }
            catch
            {
                return null;
            }
        }
        
        /// <summary>
        /// Возвращает INT из строки или null
        /// </summary>
        /// <param name="table"></param>
        /// <param name="row"></param>
        /// <param name="cell"></param>
        /// <returns></returns>
        private static int? GetIntValue(Table table, int row, int cell)
        {
            int result;
            try
            {
                var value = table.Cell(row, cell).Range.Text;
                value = value.Replace("\r", string.Empty);
                value = value.Replace("\a", string.Empty);
                value.Trim();
                var parseResult = int.TryParse(value, out result);
                if (!parseResult) return null;
            }
            catch
            {
                return null;
            }
            return result;
        }

        /// <summary>
        /// Получить значение типа BOOL из ячейки таблицы
        /// </summary>
        /// <param name="table"></param>
        /// <param name="row">номер ряда начиная с 1</param>
        /// <param name="cell">номер ячейки в ряде начиная с 1</param>
        /// <returns>true, false, null - если ячейки не существует</returns>
        private static bool? GetBoolValue(Table table, int row, int cell)
        {
            try
            {
                var value = table.Cell(row, cell).Range.Text;
                value = value.Replace("\r", string.Empty);
                value = value.Replace("\a", string.Empty);
                if (!string.IsNullOrEmpty(value)) return true;
            }
            catch
            {
                return null;
            }
            return false;
        }

        #endregion

        ///// <summary>
        ///// Открывает документ Word
        ///// </summary>
        ///// <param name="path"></param>
        ///// <param name="isReadOnly"></param>
        ///// <returns></returns>
        //public static Document OpenDocFile(string path, bool isReadOnly = true)
        //{
        //    object readOnly = isReadOnly;
        //    object inFile = path;
        //    Application wordApplication;

        //    return null;
        //}

        //public static void OpenDoc(string path)
        //{
        //    //что-то типо клиента для доступа в ворд
        //    Application wordApp = null;

        //    try
        //    {
        //        // если есть экземпляр - использовать его
        //        Global wordGlob = new Global();
        //        wordApp = wordGlob.Application;
        //    }
        //    catch
        //    {
        //        // если экземпляра нет - создать
        //        wordApp = new Application();

        //        wordApp.Visible = true;
        //    }

        //    object dotfile = path;


        //    object Unknown = Type.Missing;

        //    Document wordDoc = null;
        //    //try
        //    //{
        //    wordDoc = wordApp.Documents.Open(ref dotfile, ref Unknown,
        //                                                                       ref Unknown, ref Unknown,
        //                                                                       ref Unknown, ref Unknown,
        //                                                                       ref Unknown, ref Unknown,
        //                                                                       ref Unknown, ref Unknown,
        //                                                                       ref Unknown, ref Unknown,
        //                                                                       ref Unknown, ref Unknown,
        //                                                                       ref Unknown, ref Unknown);
        //}
    }

    #region Bookmarks

    /// <summary>
    /// Закладки в word-документе
    /// </summary>
    public enum DocBookmarks
    {

        /// <summary>
        /// Название клиента
        /// </summary>
        ClientName,

        /// <summary>
        /// Имя контактного лица
        /// </summary>
        ContactName,

        /// <summary>
        /// Факс
        /// </summary>
        Fax,

        /// <summary>
        /// Телефон
        /// </summary>
        Phone,

        /// <summary>
        /// Дилер
        /// </summary>
        Dialer,

        /// <summary>
        /// Основание скидки
        /// </summary>
        DiscountBase,

        /// <summary>
        /// Сумма скидки
        /// </summary>
        DiscountSum,

        /// <summary>
        /// Номер документа
        /// </summary>
        DocNumber,

        /// <summary>
        /// Категория
        /// </summary>
        Kategory,

        /// <summary>
        /// Длина (длительность)
        /// </summary>
        Length,

        /// <summary>
        /// Транспорт
        /// </summary>
        Transport,

        /// <summary>
        /// Дата регистрации
        /// </summary>
        RegistrationDate,

        /// <summary>
        /// Населённый пункт
        /// </summary>
        Settlement,

        /// <summary>
        /// Номер артикула
        /// </summary>
        ArticleName,

        /// <summary>
        /// Адрес электронной почты для связи
        /// </summary>
        ContactEmail,

        /// <summary>
        /// Дата
        /// </summary>
        Date,

        /// <summary>
        /// Имя контактного лица 1
        /// </summary>
        ContactName1,

        /// <summary>
        /// Название курса
        /// </summary>
        CourseName,

        /// <summary>
        /// Название курса
        /// </summary>
        CourseName1,

        /// <summary>
        /// Дата курса
        /// </summary>
        CourseDate,

        /// <summary>
        /// Дата курса
        /// </summary>
        CourseDate1,

        /// <summary>
        /// Участники
        /// </summary>
        Members,

        /// <summary>
        /// Кол-во участников
        /// </summary>
        MembersCount,

        /// <summary>
        /// Название площалки
        /// </summary>
        PlaceName,

        /// <summary>
        /// Имя тренера
        /// </summary>
        TrainerName,

        /// <summary>
        /// Название юр. лица
        /// </summary>
        LegalEntityName,

        /// <summary>
        /// Название юр. лица
        /// </summary>
        LegalEntityName1,

        /// <summary>
        /// Реквизиты юр. лица
        /// </summary>
        LegalEntitiesElements,

        /// <summary>
        /// Год истечения
        /// </summary>
        ExpirationYear,

        /// <summary>
        /// Генеральный директор в родительном падеже
        /// </summary>
        ClientGeneralDirectorNameInRP,

        /// <summary>
        /// Номер договора
        /// </summary>
        AgreementNumber,

        /// <summary>
        /// Номер договора
        /// </summary>
        AgreementNumber1,

        /// <summary>
        /// Номер дополнительного соглашения
        /// </summary>
        AdditionalAgreementNumber,

        /// <summary>
        /// Дата создания договора
        /// </summary>
        AgreementCreationDate,

        /// <summary>
        /// Продукты
        /// </summary>
        Products,

        /// <summary>
        /// Курс
        /// </summary>
        Rate,

        /// <summary>
        /// Количество календарных дней
        /// </summary>
        KTCount,

        /// <summary>
        /// Сумма кредита
        /// </summary>
        CreditAmount,

        /// <summary>
        /// ФИО директора
        /// </summary>
        DirectorFIO,

        /// <summary>
        /// Идентификатор (Номер заявки)
        /// </summary>
        Id,

        /// <summary>
        /// Город
        /// </summary>
        Сity,

        /// <summary>
        /// Город
        /// </summary>
        Сity1,

        /// <summary>
        /// Имя менеджера по продажам
        /// </summary>
        ManagerName,

        /// <summary>
        /// Имя менеджера по продажам
        /// </summary>
        ManagerName1,

        /// <summary>
        /// Название компании
        /// </summary>
        CompanyName,

        /// <summary>
        /// Название компании
        /// </summary>
        CompanyName1,

        /// <summary>
        /// продолжительность курса
        /// </summary>
        Duration,

        /// <summary>
        /// продолжительность курса
        /// </summary>
        Duration1,

        /// <summary>
        /// Ссылка на карточку клиента, где менеджер может посмотреть новые заявки
        /// </summary>
        LinkForManager,

        /// <summary>
        /// Список участников, которым отказали :) (лузеры)
        /// </summary>
        MembersRefuse,

        /// <summary>
        /// Адрес
        /// </summary>
        Address,

        /// <summary>
        /// Наладка 
        /// </summary>
        Adjustment,

        /// <summary>
        /// Замена/Ремонт
        /// </summary>
        Repair,

        /// <summary>
        /// Проверка на ДК и СОП
        /// </summary>
        Checking,

        /// <summary>
        /// Инспекция
        /// </summary>
        Inspection,

        /// <summary>
        /// Рекламация 
        /// </summary>
        Reclamation,

        /// <summary>
        /// Номер производства 
        /// </summary>
        ProductionNumber,

        /// <summary>
        /// MarkKbe 
        /// </summary>
        MarkKbe,

        /// <summary>
        /// EtalonEngine58mm 
        /// </summary>
        MarkKbeEtalonEngine58mm,

        /// <summary>
        /// ExpertEnergy70mm 
        /// </summary>
        MarkKbeExpertEnergy70mm,

        /// <summary>
        /// Select70mm 
        /// </summary>
        MarkKbeSelect70mm,

        /// <summary>
        /// System88mm 
        /// </summary>
        MarkKbeSystem88mm,

        /// <summary>
        /// MarkTrocal 
        /// </summary>
        MarkTrocal,

        /// <summary>
        /// SolidBalance70mm 
        /// </summary>
        MarkTrocalSolidBalance70mm,

        /// <summary>
        /// InnonovaA570mm 
        /// </summary>
        MarkTrocalInnonovaA570mm,

        /// <summary>
        /// InnonovaM570mm 
        /// </summary>
        MarkTrocalInnonovaM570mm,

        /// <summary>
        /// MarkGutwerk 
        /// </summary>
        MarkGutwerk,

        /// <summary>
        /// MarkGutwerkGutWerk58mm 
        /// </summary>
        MarkGutwerkGutWerk58mm,

        /// <summary>
        /// MarkGutwerkGutWerk70mm 
        /// </summary>
        MarkGutwerkGutWerk70mm,


        /// <summary>
        /// ФИО директора кратко
        /// </summary>
        DirectorFIOShort,
    }


    #endregion
}
